#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/timer.h>
// myleds{
//     compatible = "hqyj,leds";
//     core_leds {
//      led1 = <&gpioz 5 0>;
//     	led2 = <&gpioz 6 0>;
//     	led3 = <&gpioz 7 0>;
//     };
//     extend_leds{
//     	led1 = <&gpioe 10 0>;
//     	led2 = <&gpiof 10 0>;
//     	led3 = <&gpioe 8 0>;
//     };
// };
struct device_node* node;
char* pname[] = { "led1", "led2", "led3" };
int gpiono[3] = { 0 };
struct timer_list mytimer;
void timer_led_blink(struct timer_list *timer)
{
    gpio_set_value(gpiono[0],!gpio_get_value(gpiono[0]));
    mod_timer(&mytimer,jiffies+HZ);
}
static int __init myleds_init(void)
{
    int i, ret;
    // 1.获取device_node
    node = of_find_node_by_path("/myleds/extend_leds");
    if (node == NULL) {
        printk("parse device node error\n");
        return -ENODATA;
    }
    // 2.获取gpio编号
    for (i = 0; i < ARRAY_SIZE(gpiono); i++) {
        gpiono[i] = of_get_named_gpio(node, pname[i], 0);
        if (gpiono[i] < 0) {
            printk("get gpio number error\n");
            return -EINVAL;
        }
        // 3.申请要使用的gpio
        if ((ret = gpio_request(gpiono[i], NULL)) != 0) {
            printk("reqeust gpio error");
            return ret;
        }
        // 4.操作gpio
        gpio_direction_output(gpiono[i], 1);
    }
    // 3.初始化并启动定时器
    mytimer.expires = jiffies + HZ;
    timer_setup(&mytimer,timer_led_blink,0);
    add_timer(&mytimer);

    return 0;
}
static void __exit myleds_exit(void)
{
    int i;
    del_timer(&mytimer);
    for (i = 0; i < ARRAY_SIZE(gpiono); i++) {
        gpio_set_value(gpiono[i], 0);
        gpio_free(gpiono[i]);
    }
}
module_init(myleds_init);
module_exit(myleds_exit);
MODULE_LICENSE("GPL");